Domain Object
OOPの話をされることが多いが、FPでも同じ
OOPなら、classの設計方針
FPなら、module(型と関数のまとまり)の設計方針
の話になる
データと機能を同じ場所に書く
データの加工、計算のロジックを一箇所に集約する
業務の関心事と、コードを対応させる
ref 抽象度を揃えて書く
業務のルールに変更があった時に、変更の影響を狭い範囲に閉じ込める
そのデータを使うロジックはDomain Object内に書く
Domain Objectの利用者は、その値をただ使用するだけ。
class名は業務に使っている用語を使う
ロジックのためだけにmethodを作る
逆に言うとgetterは不要
何かしらの計算をした結果を返すようにmethodを作る
ただ値を返すだけのgetterになってないか?を指標にできるmrsekut.icon
ただ値を返すだけということは、class外でそれを使って計算しているのでは、ということにつながる
その値を使った計算はDomainObject内に含めるべき
『オブジェクト指向設計実践ガイド』.iconでは、普通はpropertyはprivateにしてgetterを用意しよう
なぜならgetterを取得時に修正したくなった時にこっちのほうが楽だから
という感じで説明されていたが、良くなかったなmrsekut.icon
getter経由で基本はそのまま返して、たまに計算して返そう、という普通に読めてしまう
まあこれはmodelingの本ではなく、OOP入門の本だから仕方ないのか(?)
いくつか疑問はある #??
その値の計算に、Entity外の情報が必要な場合はどうするのか?
引数で他のデータを受け取るのか #??
そのデータは計算前の情報である必要があったりはしないのか?
それともDIかなにかで流し込むのか?
使う側のクラスには業務ロジックを書かない
書いていたら適宜見直して別クラスに移動
適宜見直す、というのがOOPの基本なのらしいmrsekut.icon
継続的にリファクタリングが必要
そのためにも関数は小さく作るべき
これって型がないと割と厳しい気もする
テストは必須だろう
修正によるデグレをビビっている状況にあることがもう問題
この「書き直し」をいかに楽できるように工夫するか、がポイントになってくる
method内では、必ずinstance変数を使う
classを小さく作る
関連性の強いクラスはパッケージで整理していく
パッケージとはclassの集合のこと
増えてきたclassを何かしらの指標でまとめたものがパッケージ
いまいちパッケージが具体的に何の昨日のことを指しているのかわからない #??
あと階層にしていくのは微妙な気がするmrsekut.icon
参考
/mrsekut-book-477419087X/070 (第3章 業務ロジックをわかりやすく整理する)
/mrsekut-book-477419087X/096 (第4章 ドメインモデルの考え方で設計する)